package cn.wolfcode.crm.service.impl;

import cn.wolfcode.crm.domain.Permission;
import cn.wolfcode.crm.mapper.PermissionMapper;
import cn.wolfcode.crm.query.PageResult;
import cn.wolfcode.crm.query.QueryObject;
import cn.wolfcode.crm.service.IPermissionService;
import cn.wolfcode.crm.util.RequiredPermission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.stereotype.Service;

import java.lang.reflect.Method;
import java.util.Collection;
import java.util.List;
import java.util.Map;

//使用IOC的注解告诉SPring来帮我们管理当前对象
@Service
public class PermissionServiceImpl implements IPermissionService {
    @Autowired//自动注入
    private PermissionMapper mapper;

    //1.获取Spring容器对象
    //从容器自动获取容器对象，再设置给当前字段
    @Autowired
    private ApplicationContext ctx;

    @Override
    public void save(Permission dept) {
        mapper.save(dept);
    }

    @Override
    public void delete(Long id) {
        mapper.delete(id);
    }

    @Override
    public void update(Permission dept) {
        mapper.update(dept);
    }

    @Override
    public Permission get(Long id) {
        return mapper.get(id);
    }

    @Override
    public List<Permission> listAll() {
        return mapper.listAll();
    }

    @Override
    public PageResult query(QueryObject qo) {
        //封装用户需要的数据
        int count = mapper.selectForCount(qo);
        List<Permission> list = mapper.selectForList(qo);

        //将用户需要的所有的数据封装起来
        return new PageResult(list,count,qo.getCurrentPage(),qo.getPageSize());
    }

    public void reload() {
        //应该在点击加载时，不要将已经存在的权限保存到数据库

        //1.将存在的数据查询出来
        List<String> expressions = mapper.listAllExpressions();
        //2.判断当前的权限是否存在






        //在Spring中可以管理所有的对象
        //获取容器中所有的Controller对象
        Map<String, Object> beansWithAnnotation = ctx.getBeansWithAnnotation(Controller.class);
        Collection<Object> controllers = beansWithAnnotation.values();

        System.out.println(controllers);
        //获取Controller对象中的所有的方法
        for (Object controller : controllers) {
            System.out.println(controller.getClass());
            //使用反射获取对象中的方法
            Method[] methods = controller.getClass().getDeclaredMethods();
            for (Method method : methods) {
                //如果当前方法上有权限注解，那么直接获取到
                if(method.isAnnotationPresent(RequiredPermission.class)){
                    //获取方法上的注解
                    //存在
                    RequiredPermission annotation = method.getAnnotation(RequiredPermission.class);
                    //获取注解中的数据（name，expression）
                    //权限名称
                    String name = annotation.name();
                    //权限表达式
                    String expression = annotation.expression();

                    if(!expressions.contains(expression)) {

                        //将拿到的数据保存到数据库中
                        Permission p = new Permission();
                        p.setName(name);
                        p.setExpression(expression);
                        mapper.save(p);
                    }
                }
            }
        }



    }

    public List<String> getExpressionsByEmpId(Long id) {
        return mapper.selectExpressionsByEmpId(id);
    }


}
